/**
 * Copyright (c) [2025] [AGIROS] 
 * [travoddsgen] is licensed under Mulan PSL v2. 
 * You can use this software according to the terms and conditions of the Mulan PSL v2. 
 * You may obtain a copy of Mulan PSL v2 at: 
 *          http://license.coscl.org.cn/MulanPSL2 
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 
 * See the Mulan PSL v2 for more details.
 */ 

#ifndef cpplangtypenamevisitor_h__
#define cpplangtypenamevisitor_h__

#include "DefaultVisitor.h"
#include "SyntaxCheckerVisitor.h"
#include "IDLParser.h"
#include "Ast.h"
#include <map>
#include <set>

class CppLangTypeNameVisitor : public DefaultVisitor {
public:
    CppLangTypeNameVisitor(SyntaxCheckerVisitor& syntaxCheckerVisitor, IDLParser& parser) 
    : syntaxCheckerVisitor_(syntaxCheckerVisitor), parser_(parser) {}
    void visit(ModuleDclNode& node) override;
    void visit(StructDefNode& node) override;
    void visit(StructForwardDclNode& node) override;
    void visit(UnionDefNode& node) override;
    void visit(UnionForwardDclNode& node) override;
    void visit(EnumDclNode& node) override;
    void visit(ConstDclNode& node) override;
    void visit(BaseTypeNode& node) override;
    void visit(ScopedNameNode& node) override;
    void visit(SequenceTypeNode& node) override;
    void visit(StringTypeNode& node) override;
    void visit(WideStringTypeNode& node) override;
    void visit(FixedPtTypeNode& node) override;
    void visit(MapTypeNode& node) override;
    void visit(FixedArraySizeNode& node) override;
    void visit(OrExprNode& node) override;
    void visit(XorExprNode& node) override;
    void visit(AndExprNode& node) override;
    void visit(ShiftExprNode& node) override;
    void visit(AddExprNode& node) override;
    void visit(MultExprNode& node) override;
    void visit(UnaryExprNode& node) override;
    void visit(PrimaryExprNode& node) override;
    void visit(LiteralNode& node) override;
    void visit(TypeDefDclNode& node) override;
    void visit(IncludeDclNode& node) override;

    /** 
     * @brief 查找ASTNode*对应的名称。
     * 
     * @param node ASTNode*。
     * 
     * @return ASTNode*对应的名称。
     */

    std::string findName(ASTNode* node);

    /**
     * @brief 获取除去命名空间前缀的类型名称。
     * 
     * @param node ASTNode*。
     * 
     * @return 简要名称。
     */
    std::string findShortName(ASTNode* node);

    /**
     * @brief 查找ScopedNameNode*对应的类型定义。
     * 
     * @param node ScopedNameNode*。
     * 
     * @return ScopedNameNode*对应的类型定义。
     */
    DefinitionNode* findType(ScopedNameNode* node);

    /**
     * @brief 获取前置声明的类型。
     * 
     * @return 前置声明的类型。
     */
    const std::map<std::string, std::string>& getForwardDeclare() { return forwardDeclare_; }
    
    /**
     * @brief 获取枚举的bitbound值。
     * 
     * @param node EnumDclNode*。
     * 
     * @return 枚举的bitbound值。
     */
    std::string getBitbound(EnumDclNode& node);

    /**
     * @brief 获取包含文件的名称，用于生成头文件时include头文件。
     * 
     * @param node IncludeDclNode*。
     * 
     * @return 包含文件的名称。
     */
    std::string getIncludedFileName(IncludeDclNode& node);
protected:
    /**
     * @brief 从模块栈构建模块名前缀。
     * 
     * @return 模块名前缀。
     */
    virtual std::string modulePrefix();

    /**
     * @brief 从scopedName构造出完整的名称。
     * 
     * @param
     */
    virtual std::string scopedName(ScopedNameNode* node, unsigned int length);

protected:
    /** @brief ASTNode*的名称映射。 */
    std::map<ASTNode*, std::string> nameMap_;
    /** @brief ScoppedName对应的类型，标识符映射为类型定义的节点，用于查找相关类型的属性。 */
    std::map<ScopedNameNode*, DefinitionNode*> scopedNameTypeMap_;
    /** @brief 前置声明的类型，在生成代码时需要优先输出 */
    std::map<std::string, std::string> forwardDeclare_;
    /** @brief 当前模块栈，用于计算当前处理的类型所属模块。 */
    std::vector<std::string> moduleStack_;
    /** @brief 语法检查访问器，用于获取包含文件信息。 */
    SyntaxCheckerVisitor& syntaxCheckerVisitor_;
    /** @brief 用于递归处理包含的IDL文件. */
    IDLParser& parser_;
};

#endif // cpplangtypenamevisitor_h__